#include <stdio.h>  
#include <stdlib.h>  
  
// 假设的图形元素（享元）的内部状态  
typedef struct {  
    int color; // 假设颜色是可以共享的内部状态  
} GraphicsElementIntrinsicState;  
  
// 享元对象，包含内部状态和外部状态  
typedef struct GraphicsElement {  
    GraphicsElementIntrinsicState* intrinsicState; // 内部状态指针  
    int x, y; // 外部状态（如位置），通常由客户端管理  
} GraphicsElement;  
  
// 享元工厂，用于存储和检索享元对象  
typedef struct {  
    GraphicsElement* elements[256]; // 假设颜色范围从0到255，用于简化示例  
} GraphicsElementFactory;  
  
// 初始化享元工厂  
void initGraphicsElementFactory(GraphicsElementFactory* factory) {  
    for (int i = 0; i < 256; i++) {  
        factory->elements[i] = NULL;  
    }  
}  
  
// 获取享元对象，如果不存在则创建  
GraphicsElement* getGraphicsElement(GraphicsElementFactory* factory, int color) {  
    if (factory->elements[color] == NULL) {  
        // 分配新的享元对象  
        factory->elements[color] = (GraphicsElement*)malloc(sizeof(GraphicsElement));  
        factory->elements[color]->intrinsicState = (GraphicsElementIntrinsicState*)malloc(sizeof(GraphicsElementIntrinsicState));  
        factory->elements[color]->intrinsicState->color = color;  
    }  
    return factory->elements[color];  
}  
  
// 使用享元对象（在单片机中，这里可能涉及到实际的绘制操作）  
void drawGraphicsElement(GraphicsElement* element, int x, int y) {  
    element->x = x;  
    element->y = y;  
    // 假设这里有一个绘制函数，它使用内部状态（颜色）和外部状态（位置）  
    printf("Drawing element at (%d, %d) with color %d\n", element->x, element->y, element->intrinsicState->color);  
}  
  
int main() {  
    GraphicsElementFactory factory;  
    initGraphicsElementFactory(&factory);  
  
    // 获取并绘制两个不同颜色的图形元素  
    GraphicsElement* element1 = getGraphicsElement(&factory, 123);  
    drawGraphicsElement(element1, 10, 20);  
  
    GraphicsElement* element2 = getGraphicsElement(&factory, 45);  
    drawGraphicsElement(element2, 30, 40);  
  
    // 注意到我们再次请求颜色为123的图形元素时，它会被重用  
    GraphicsElement* element3 = getGraphicsElement(&factory, 123);  
    drawGraphicsElement(element3, 50, 60);  
  
    // 清理（在真实的嵌入式系统中，可能需要更复杂的内存管理策略）  
    // ...  
  
    return 0;  
}